from django.shortcuts import render
import re
import random,string
import redis

from rest_framework.views import APIView
from django.http import HttpResponse
from rest_framework.response import Response
from .models import User
from captcha.image import ImageCaptcha   # 图片验证码三方模块
# Create your views here.
class CheckUsername(APIView):
    def get(self,request,username):
     #用户名不能为空
      if not username:
          return Response({'code':400,'msg':'用户名不能为空'},status=400)
      #判断用户名的格式是否对
      if not re.findall(r"^[a-zA-Z][a-zA-Z0-9_]\w{4,15}$",username):
          return Response({'code': 400, 'msg': '用户名格式不正确'}, status=400)
      # 判断用户名是否存在
      if User.objects.filter(username=username).count()>0:
          return Response({'code':400,'msg':'用户名存在'},status=400)
      return Response({'code':200,'msg':'校验用户名通过'})

# 校验手机号
class CheckMobile(APIView):
    def get(self,request,mobile):
        if not mobile:
            return Response({'msg': '手机号不能为空', 'code': 400}, status=400)
        # 判断手机号的格式是否正确
        if not re.findall(r"1[3-9][0-9]{9}$",mobile):
            return Response({'code':400,'msg':'手机号格式不正确'})
        # 判断手机号是否重复
        if User.objects.filter(mobile=mobile).count()>0:
            return Response({'code':400,'msg':'手机号已注册'})
        return Response({'code':200,'msg':'手机号校验通过'})

# 图片验证码
class ImCodeViews(APIView):
    def get(self,request,uuid):
        # random.sample（字符串，个数）从指定字符串中取若干个字符
        # 1.利用随机模块生成随机字符串    数字              +    字母
        img_code=''.join(random.sample(string.ascii_letters+string.digits,4))
        # 2.将验证码保存到redis
        r=redis.Redis(host='localhost',port=6379,db=5)
        # 保存数据    键 uuid  值：img_code（随机验证码） 过期时间
        r.set(uuid,img_code,ex=120)
        r.close()
        #3.生成图片流
        cap = ImageCaptcha()   #定义对象
        img = cap.generate(img_code)  #生成图片流   调用对象
        #content_type返回的内容的类型 content返回的内容
        return HttpResponse(content_type='image/png',content=img)

        # 图片验证码校验
    def post(self, request, uuid):
        # 1.提取前端post参数中的图片验证码
         code1 = request.data.get('code')
         # 2.获取redis中的图片验证码
         r = redis.Redis(host='localhost', port=6379, db=5)
         # 获取redis中的验证码
         code2 = r.get(uuid)
         r.close()
         # 3.判断验证码是否过期
         # code2在的话就能使用
         if code2:
             # redis里面的数据是二进制数据，必须解码才可使用
             aa = code2.decode()  # 解码
         else:
             return Response({'code': 400, 'msg': '验证码已过期'})
         # 4.判断验证码是否正确，不区分大小写
         if aa.lower() != code1.lower():
              return Response({'code': 401, 'msg': '验证码错误'})
         return Response({'code': 200, 'msg': '验证码通过'})


class RegisterView(APIView):
    # 用户注册
    def post(self, request):
        # 1.提取前端post参数中的数据
        username = request.data.get('username')
        password1 = request.data.get('password1')
        password2 = request.data.get('password2')
        mobile = request.data.get('mobile')
        agree = request.data.get('agree')  # 同意用户协议
        # 判断字段是否完整   可有可无  agree不加在里面判断  fales会照成逻辑异常
        if not all([username, password1, password2, mobile]):
            return Response({'code': 403, 'msg': '字段不完整'})
        # 2.判断是否同意用户协议
        if not agree:
            return Response({'code': 400, 'msg': '请勾选用户协议'})
        # 3.两次密码是否一致
        if password1 != password2:
            return Response({'code': 401, 'msg': '两次密码不一致'})
        # 4.注册用户
        User.objects.create(
            username=username, password=password1, mobile=mobile)
        return Response({'code': 200, 'msg': '注册成功'})

 # 用于生成jwt token信息   登录成功使用
#  登录成功把token
import jwt
from wlgday3.settings import SECRET_KEY
# 对用户信息加密
def get_jwt(user):
    payload = {
        # 对id进行加密
        'id': user.id,
        'username': user.username,
    }
    # 保存（token）生成jwt的方法：jwt.encode(加密内容（对谁加密）, 秘钥, 加密方式)
    token = jwt.encode(payload=payload, key=SECRET_KEY, algorithm='HS256')
    return token

# Q查询或者
from django.db.models import Q
class LoginView(APIView):
    # 用户登录
    def post(self, request):
        # 1. 提取前端post参数中的用户名 和 密码
        a= request.data.get('username')  # 可能是用户名 也可能是手机号
        password = request.data.get('password')
        # 2.判断用户是否存在
        try:
            # 多方式登录
            # 可能是用户名 也可能是手机号  获取不到数据出现异常
            user = User.objects.get(Q(username=a)|Q(mobile=a))
        except Exception as e:
            print(e)
            return Response({'code':400, 'msg':'用户不存在'})
        # 3.获取数据判断密码是否正确
        if user.password != password:
            return Response({'code': 401, 'msg': '密码错误'})
        # 4.生成token
        token = get_jwt(user)

        return Response({
            'code': 200,
            'msg': '登录成功',
            'token':token,
            'user':{  # 登录成功  返回用户信息   用于前端展示 可返回可不返回
                'id':user.id,
                'userName':user.username,
            }
        })

